package model

import (
	"context"
	"gitee.com/kmyss/gf-ex/yscmd"
	"gitee.com/kmyss/gf-ex/yslog"
	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/os/gcmd"
	"github.com/gogf/gf/v2/os/gfile"
	"github.com/gogf/gf/v2/os/gproc"
	"github.com/gogf/gf/v2/os/gtime"
	"github.com/gogf/gf/v2/text/gstr"
)

type BundleConfigInput struct {
	Path      string // 二进制文件路径
	NewBranch string // 新分支

	Project string // 二进制文件带的项目名
	Branch  string // 二进制文件对应分支
	Date    string // 二进制文件对日期
}

func (p *BundleConfigInput) GetNewBranch(ctx context.Context) {
	// 生成默认的名称
	branchName, err := gproc.ShellExec(ctx, "git config user.name")
	if err != nil {
		branchName = ""
	}
	branchName = gstr.TrimAll(branchName)
	branchName = branchName + gtime.Now().Format("Ymd")

	p.NewBranch = yscmd.ScanWithDefaultN("请输入新分支名称", branchName)
}

func (p *BundleConfigInput) GetPath(path ...string) error {
	if len(path) > 0 {
		p.Path = path[0]
		return p.checkPath()
	}

	// 直到读取到对的输入
	for true {
		p.Path = gcmd.Scan("请输入二进制文件的路径:")

		err := p.checkPath()
		if err == nil {
			break
		}
		yslog.Error("请重新输入：", err)
	}

	return nil
}

func (p *BundleConfigInput) Show() {
	yslog.Print("项目:", p.Project)
	yslog.Print("分支:", p.Branch)
	yslog.Print("创建时间:", p.Date)
}

func (p *BundleConfigInput) checkPath() error {
	p.pathProcess()

	if !gfile.Exists(p.Path) {
		return gerror.New("指定路径不存在!" + p.Path)
	}

	// 字符串分割后的数组
	//
	ss := gstr.Split(gfile.Name(p.Path), "-")
	l := len(ss)
	if l < 3 {
		return gerror.New("文件命名存在问题!  应为 projectName-branch-date")
	}

	p.Date = ss[l-1]
	p.Branch = ss[l-2]
	p.Project = gstr.Join(ss[:l-2], "-")

	p.Show()

	return nil
}

func (p *BundleConfigInput) pathProcess() {
	// 去除多于的引号
	p.Path = gstr.TrimStr(p.Path, "\"")

	// 对于 git 路径进行处理
	if gstr.HasPrefix(p.Path, "/") {
		p.Path = p.Path[1:2] + ":" + p.Path[2:]
	}
}
